home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Screenblankers / GBlanker / GSource / Blankers / Moiré / blank.c next >
C/C++ Source or Header  |  1996-09-26  |  4KB  |  215 lines

  1. /*
  2.  *  Copyright (c) 1994 Michael D. Bayne.
  3.  *  All rights reserved.
  4.  *
  5.  *  Please see the documentation accompanying the distribution for distribution
  6.  *  and disclaimer information.
  7.  */
  8.  
  9. #include <exec/memory.h>
  10. #include <hardware/custom.h>
  11. #include "/includes.h"
  12.  
  13. #define TRAIL  0
  14. #define LINES  2
  15. #define XSPEED 4
  16. #define YSPEED 6
  17. #define COLORS 8
  18. #define MODE   10
  19.  
  20. extern __far struct Custom custom;
  21. Triplet *ColorTable = 0L;
  22.  
  23. #define RAND( base, offset ) (( LONG )( RangeRand( base ) + offset ))
  24.  
  25. #include "Moiré_rev.h"
  26. STATIC const UBYTE VersTag[] = VERSTAG;
  27.  
  28. VOID Defaults( PrefObject *Prefs )
  29. {
  30.     Prefs[TRAIL].po_Level = 64;
  31.     Prefs[LINES].po_Level = 2;
  32.     Prefs[XSPEED].po_Level = 16;
  33.     Prefs[YSPEED].po_Level = 16;
  34.     Prefs[COLORS].po_Active = 3;
  35.     Prefs[MODE].po_ModeID = getTopScreenMode();
  36. }
  37.  
  38. LONG Blank( PrefObject *Prefs )
  39. {
  40.     LONG numCols, i, j, k, n, Trail, xSpeed, ySpeed, Wid, Hei, **cx, **cy, *dx;
  41.     LONG ToFrontCount = 0, RetVal = OK,    *dy, nl;
  42.     struct Screen *Scr;
  43.     struct Window *Wnd;
  44.     struct RastPort *rp;
  45.     struct ViewPort *vp;
  46.  
  47.     xSpeed = Prefs[XSPEED].po_Level;
  48.     ySpeed = Prefs[YSPEED].po_Level;
  49.     nl = Prefs[LINES].po_Level;
  50.     Trail = Prefs[TRAIL].po_Level;
  51.  
  52.     cx = AllocVec( nl * sizeof( LONG * ), MEMF_CLEAR );
  53.     cy = AllocVec( nl * sizeof( LONG * ), MEMF_CLEAR );
  54.     dx = AllocVec( nl * sizeof( LONG ), MEMF_CLEAR );
  55.     dy = AllocVec( nl * sizeof( LONG ), MEMF_CLEAR );
  56.  
  57.     if( cx && cy )
  58.     {
  59.         for( k = 0; k < nl; k++ )
  60.         {
  61.             if(!( cx[k] = AllocVec( Trail * sizeof( LONG ), MEMF_CLEAR )))
  62.                 break;
  63.             if(!( cy[k] = AllocVec( Trail * sizeof( LONG ), MEMF_CLEAR )))
  64.                 break;
  65.         }
  66.     }
  67.         
  68.     Scr = OpenScreenTags( 0l, SA_DisplayID, Prefs[MODE].po_ModeID,
  69.                          SA_Depth, Prefs[MODE].po_Depth, SA_Quiet, TRUE,
  70.                          SA_Behind, TRUE, SA_Overscan, OSCAN_STANDARD,
  71.                          TAG_DONE );
  72.     
  73.     if( cx && cy && dx && dy &&( k == nl )&& Scr )
  74.     {
  75.         rp = &( Scr->RastPort );
  76.         vp = &( Scr->ViewPort );
  77.         Wid = Scr->Width;
  78.         Hei = Scr->Height;
  79.         
  80.         numCols = 1 << rp->BitMap->Depth;
  81.         
  82.         SetRGB4( vp, 0, 0, 0, 0 );
  83.  
  84.         switch( Prefs[COLORS].po_Active )
  85.         {
  86.         case 0:
  87.             ColorTable = RainbowPalette( Scr, 0L, 1L, 0L );
  88.             break;
  89.         case 1:
  90.             SetRGB4( vp, 1, RAND( 14, 1 ), RAND( 14, 1 ), RAND( 14, 1 ));
  91.             break;
  92.         case 3:
  93.             setCopperList( Hei, 1, vp, &custom );
  94.         case 2:
  95.             SetRGB4( vp, 1, 15, 15, 15 );
  96.             break;
  97.         }
  98.         
  99.         for( k = 0; k < nl; k++ )
  100.         {
  101.             cx[k][1] = RAND( Wid - 2, 1 );
  102.             cy[k][1]= RAND( Hei - 2, 1 );
  103.             dx[k] = RAND( xSpeed, 1 );
  104.             dy[k] = RAND( ySpeed, 1 );
  105.         }
  106.         i = 0;
  107.         j = 0;
  108.         
  109.         Wnd = BlankMousePointer( Scr );
  110.         ScreenToFront( Scr );
  111.         
  112.         while( RetVal == OK )
  113.         {
  114.             if(!( ++ToFrontCount % 5 ))
  115.                 WaitTOF();
  116.  
  117.             if(!( ToFrontCount % 300 ))
  118.                 ScreenToFront( Scr );
  119.             
  120.             i = (i+1) % Trail;
  121.             n = (i+1) % Trail;
  122.             j = (j+1) % 255;
  123.             
  124.             if( !Prefs[COLORS].po_Active )
  125.                 SetAPen( rp, ( j * ( numCols - 1 )) / 255 + 1 );
  126.             else
  127.                 SetAPen( rp, 1 );
  128.             
  129.             for( k = 0; k < nl; k++ )
  130.             {
  131.                 if( cx[k][i] >= Wid )
  132.                 {
  133.                     dx[k] = -1 * RAND( xSpeed, 1 );
  134.                     cx[k][i] = Wid-1;
  135.                 }
  136.                 else
  137.                     if( cx[k][i] < 0 )
  138.                     {
  139.                         dx[k] = RAND( xSpeed, 1 );
  140.                         cx[k][i] = 0;
  141.                     }
  142.                 if( cy[k][i] >= Hei )
  143.                 {
  144.                     dy[k] = -1 * RAND( ySpeed, 1 );
  145.                     cy[k][i] = Hei-1;
  146.                 }
  147.                 else
  148.                     if( cy[k][i] < 0 )
  149.                     {
  150.                         dy[k] = RAND( ySpeed, 1 );
  151.                         cy[k][i] = 0;
  152.                     }
  153.             }
  154.             
  155.             Move( rp, cx[0][i], cy[0][i] );
  156.             for( k = 1; k < nl; k++ )
  157.                 Draw( rp, cx[k][i], cy[k][i] );
  158.             if( nl > 2 )
  159.                 Draw( rp, cx[0][i], cy[0][i] );
  160.             
  161.             SetAPen( rp, 0 );
  162.             
  163.             Move( rp, cx[0][n], cy[0][n] );
  164.             for( k = 1; k < nl; k++ )
  165.                 Draw( rp, cx[k][n], cy[k][n] );
  166.             if( nl > 2 )
  167.                 Draw( rp, cx[0][n], cy[0][n] );
  168.             
  169.             for( k = 0; k < nl; k++ )
  170.             {
  171.                 cx[k][n] = cx[k][i] + dx[k];
  172.                 cy[k][n] = cy[k][i] + dy[k];
  173.             }
  174.  
  175.             if(!( ToFrontCount % 25 ))
  176.                 RetVal = ContinueBlanking();
  177.         }
  178.         UnblankMousePointer( Wnd );
  179.  
  180.         if( Prefs[COLORS].po_Active == 3 )
  181.             clearCopperList( vp );
  182.     }
  183.     else
  184.         RetVal = FAILED;
  185.  
  186.     if( cx )
  187.     {
  188.         for( k = 0; k < nl; k++ )
  189.             if( cx[k] )
  190.                 FreeVec( cx[k] );
  191.         FreeVec( cx );
  192.     }
  193.  
  194.     if( cy )
  195.     {
  196.         for( k = 0; k < nl; k++ )
  197.             if( cy[k] )
  198.                 FreeVec( cy[k] );
  199.         FreeVec( cy );
  200.     }
  201.  
  202.     if( dx )
  203.         FreeVec( dx );
  204.     if( dy )
  205.         FreeVec( dy );
  206.  
  207.     if(!( Prefs[COLORS].po_Active ))
  208.         RainbowPalette( 0L, ColorTable, 1L, 0L );
  209.     
  210.     if( Scr )
  211.         CloseScreen( Scr );
  212.  
  213.     return RetVal;
  214. }
  215.